#include <iostream>
#include "MyLog.hpp"
#include "MultiPlayerChatRoom.hpp"
#include "TcpServer.hpp"

// using namespace QiHai;
// void SpliteMessageTest()
// {
//     LOG(DEBUG) << "测试粘包问题\n";
//     std::string str = "\{\"message\": \"学习C++的各位好呀~\"\}\{\"message\": \"C++从入门到入坟\"\}\{\"message\": \"hh";
//     // std::cout << str << std::endl;
//     std::vector<std::string> strs;
//     SpliteMessage(str, strs);
//     LOG(DEBUG) << "结果\n";
//     for (auto s : strs)
//     {
//         std::cout << s << " ";
//     }
//     std::cout << std::endl;
//     LOG(DEBUG) << "剩下的str:" << str << "\n";
// }

// using namespace QiHai;
// void RequestRespondTest()
// {
//     Request req("你好");
//     std::cout << req.Serialization() << std::endl;
// }

void Call(std::unordered_map<int, QiHai::Connect*>& users, QiHai::Connect* connect, const std::string& str)
{
    // 上层执行函数，将序列化后的结果反序列化成信息
    QiHai::Request req;  // 请求
    req.DeSerialization(str);  // 反序列化
    
    std::string name = "";
    if (req._level == 0)
    {
        if (connect == nullptr)
        {
            QiHai::LOG(QiHai::WARING) << "connect is nullptr, no name..." << std::endl;
        }
        else name = connect->_connectIp + ": " + std::to_string(connect->_connectPort);
    }
    
    QiHai::Respond res(name, req._message, req._level);
    // 根据请求发送消息
    // 给每个连接对象的发送缓冲区增加此信息，随后启动他们的写监听，只要其内核发送缓冲区没有满就会进行发送
    for (auto& t : users)
    {
        QiHai::Connect* _connect = t.second;
        int sock = t.first;

        _connect->_writeBuffer += res.Serialization();  // 序列化信息
        // 启动其写监听
        _connect->_server->SetSockRW(sock, true, true);
    }
}

int main(int argc, char* argv[])
{
    // SpliteMessageTest();
    // RequestRespondTest();

    if (argc != 2)
    {
        std::cerr << "./Server port" << std::endl;
        exit(-1);
    }
    QiHai::TCPServer server(atoi(argv[1]), Call);
    server.Strat();
    return 0;
}